/**
 * 多线程死锁解决类
 * 线程死锁类里面的问题就是，哪一个线程类的字段来判断锁哪一个实体对象，就导致每次拿到锁的顺序可能是不一样的，
 * 所以我们如果把判断条件放要锁的那批对象身上，我们每次要锁的对象顺序就是固定不变的了，
 * 这样就不会出现我拿a锁等你释放b锁，你拿b锁等我释放a锁的场景了
 * @author 杨亚旭
 * @date 2019-02-14-11:51
 **/
public class DeadLockSolveThread implements Runnable {

    public int flag=1;
    private static Object o1=new Object(), o2=new Object();

    public void run() {
        System.out.println("flag="+flag);
        if(o1.hashCode()>o2.hashCode()){
            synchronized (o1){
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (o2){
                    System.out.println(1);
                }
            }
        }else {
            synchronized (o2){
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (o1){
                    System.out.println(0);
                }
            }
        }
    }

    public static void main(String[] args) {

        DeadLockSolveThread t1=new DeadLockSolveThread();
        DeadLockSolveThread t2=new DeadLockSolveThread();
        t1.flag = 1;
        t2.flag = 0;
        new Thread(t1).start();
        new Thread(t2).start();
    }
}
